package com.sse.logica;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Observable;

/**
 * IMplementacion de una cola observable, que permite insertar en la
 * cabeza de la cola. Tiene los metodos sincronizados para protegerse
 * de la concurrencia.
 * Cada vez que se inserta un elemento, se saca un elemento de la cola
 * y se le pasa a los observadores para su procesamiento
 * @author Paul
 *
 * @param <T>
 */
public class ColaAlertasObservable<T> extends Observable{
	
	/** LIsta doble que respalda la cola observable. */
	private Deque<T> colaAlertas;
	
	
	public ColaAlertasObservable() {
		colaAlertas = new LinkedList<T>();
	}
	
	public synchronized void encolar(T data){
		this.colaAlertas.add(data);
		this.setChanged();
		this.notifyObservers();
	}
	
	public synchronized void encolarConAltaPrioridad(T data){
		this.colaAlertas.addFirst(data);
		this.setChanged();
		this.notifyObservers();
	}
	
	/**
	 * Obtiene el primer elemento de la cola.
	 * @return Primer elemento de la cola, nulo si es vacio. 
	 */
	public synchronized T obtener(){
		return this.colaAlertas.poll();
	}
	

}
